package cn.zebra.dev.member.module.member.service;

import cn.zebra.dev.base.module.member.service.BaseMemberService;
import cn.zebra.dev.ibatis.plus.service.IService;
import cn.zebra.dev.ibatis.plus.utils.PageUtils;
import cn.zebra.dev.member.module.member.entity.MemberEntity;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;

/**
 * 会员用户表(基础)
 *
 * @author runnable
 * @date 2019-08-29 17:33:26
 */
public interface MemberService extends IService<MemberEntity>, BaseMemberService<MemberEntity> {
    /**
     * 查询会员信息列表
     *
     * @param params -key(查询参数)
     *               <p><b> 字段查询 </b></p>
     *               showSex                    显示会员性别<p>
     *               ShowAge                    显示会员年龄<p>
     *               showExp                    显示会员经验值<p>
     *               showCreateTime             显示会员注册时间<p>
     *               <p><b> 过滤字段查询 </b></p>
     *               notShowMemberType          不查询用户类型<p>
     *               notShowSecondaryPassword   不查询二级密码<p>
     *               notShowSecondarySalt       不查询交易密码盐<p>
     *               notShowPassword            不查询密码<p>
     *               notShowMemberPath          不显示会员关系链路径<p>
     *               notShowSalt                不查询盐<p>
     *               <p><b> 关联查询与查询条件 </b></p>
     *               showParentFlag             是否关联查询上级用户<p>
     *               memberLevelFlag            是否关联会员等级表<p>
     *               -showMemberLevel           显示会员等级<p>
     *               -memberLevelId             是否以会员等级查询<p>
     *               <p><b> 查询条件 </b></p>
     *               memberName                 根据会员名称模糊查询<p>
     *               parentId                   根据上级用户id查询<p>
     *               likeMemberPath             全文模糊查询用户id路径并且过滤查询的用户id<p>
     * @return 分页信息
     */
    PageUtils<MemberEntity> queryPage(Map<String, Object> params);

    /**
     * 根据用户手机号查询用户
     *
     * @param phone 用户手机号
     * @return 用户
     */
    @Override
    MemberEntity findMemberByPhone(String phone);

    /**
     * 根据用户id与图片路径来更新该用户头像
     *
     * @param memberId 用户id
     * @param imageUrl 图片路径
     * @return 成功返回true 失败返回false
     */
    @Override
    Boolean updateMemberHeadPhoto(Long memberId, String imageUrl);

    /**
     * 根据用户id更新用户新用户名
     *
     * @param memberId    用户id
     * @param newUsername 新用户名
     * @return 成功返回true 失败返回false
     */
    @Override
    Boolean updateMemberName(Long memberId, String newUsername);

    /**
     * 根据用户id更新性别
     *
     * @param memberId 用户id
     * @param sex      性别
     * @return 成功返回true 失败返回false
     */
    @Override
    Boolean updateMemberSex(Long memberId, Integer sex);

    /**
     * 根据用户id修改用户密码
     *
     * @param memberId    用户id
     * @param newPassword 新加密后密码
     * @return 修改成功返回 true 失败返回false
     */
    @Override
    Boolean updateMemberPassword(Long memberId, String newPassword);

    /**
     * 根据用户id修改邮箱
     *
     * @param memberId 用户id
     * @param newEmail 新Email
     * @return 修改成功返回 true 失败返回false
     */
    @Override
    Boolean updateMemberEmail(Long memberId, String newEmail);

    /**
     * 根据用户id修改手机号
     *
     * @param memberId 用户id
     * @param newPhone 新手机号
     * @return 修改成功返回 true 失败返回false
     */
    @Override
    Boolean updateMemberPhone(Long memberId, String newPhone);

    /**
     * 根据用户id修改用户密码
     *
     * @param memberId             用户id
     * @param newSecondaryPassword 新加密后二级(交易)密码
     * @return 修改成功返回 true 失败返回false
     */
    @Override
    Boolean updateMemberSecondaryPassword(Long memberId, String newSecondaryPassword);

    /**
     * 根据用户id修改用户资金密码
     *
     * @param memberId             用户id
     * @param newSecondaryPassword 新加密后二级(交易)密码
     * @return 修改成功返回 true 失败返回false
     */
    @Override
    Boolean updateMemberSecondaryPassword(Long memberId, String secondarySale, String newSecondaryPassword);

    /**
     * 根据用户手机号修改用户密码
     *
     * @param phone       用户手机号
     * @param newPassword 新加密后密码
     * @return 修改成功返回 true 失败返回false
     */
    @Override
    Boolean updateMemberPassword(String phone, String newPassword);

    /**
     * 根据用户id统计直推人数
     *
     * @param memberId 用户id
     * @return 直推人数
     */
    @Override
    Integer countMemberByParentId(Long memberId);

    /**
     * 根据用户id统计直推人数(异步返回)
     *
     * @param memberId 用户id
     * @return 直推人数
     */
    Future<MemberEntity> asyncCountMemberAndParentId(Long memberId);

    /**
     * 根据上级id 查询用户id与用户名列表
     *
     * @param parentId 上级用户id
     * @return 用户id与用户名列表
     */
    @Override
    List<MemberEntity> findIdAndMemberNameListByParentId(Long parentId);

    /**
     * 根据上级parent_id的上级parent_id查找用户id与用户名列表
     *
     * @param parentId 上级parentId
     * @return 用户id与用户名列表
     */
    @Override
    List<MemberEntity> findIdAndMemberNameListByParentIdOfParentId(Long parentId);

    /**
     * 修改会员年龄
     *
     * @param memberId 用户id
     * @param age      新修改年龄
     * @return 成功返回True 失败返回False
     */
    @Override
    Boolean updateMemberAge(Long memberId, Integer age);

    /**
     * 根据用户id查找用户信息
     *
     * @param memberId 用户id
     * @return 用户信息
     */
    @Override
    MemberEntity findById(Long memberId);

    /**
     * 用户等级升级 (以旧用户等级作为乐观锁)
     *
     * @param memberId       用户id
     * @param memberLevel    旧用户等级
     * @param newMemberLevel 新用户等级
     * @return 修改成功返回True 失败False
     */
    @Override
    Boolean updateMemberLevel(Long memberId, Long memberLevel, Long newMemberLevel);

    /**
     * 保存用户信息
     *
     * @param member 用户信息
     * @return 保存成功返回True 失败返回False
     */
    Boolean saveMember(MemberEntity member);

    /**
     * 用户经验值增加
     *
     * @param memberId 用户id
     * @param addExp   增加的经验值
     * @return 增加成功返回 True 失败返回False
     */
    @Override
    Boolean addMemberExp(Long memberId, Long addExp);

    /**
     * 用户经验修改 (以旧用户经验值作为乐观锁)
     *
     * @param memberId 用户id
     * @param exp      旧用户经验值
     * @param newExp   新用户经验值
     * @return 修改成功返回 True 失败返回False
     */
    @Override
    Boolean updateMemberExp(Long memberId, Long exp, Long newExp);

    /**
     * 根据用户id查找用户团队人数 (除自己)
     *
     * @param memberId 用户id
     * @return 团队人数
     */
    @Override
    Long findTeamNumById(Long memberId);

    /**
     * 根据parent_id查找所有用户
     *
     * @param parentId 上级用户id
     * @return 下级用户信息集合
     */
    @Override
    List<MemberEntity> findListByParentId(Long parentId);

    /**
     * 根据parent_id与用户level查找所有用户
     *
     * @param parentId 上级用户id
     * @param levelId  用户等级
     * @return 用户信息集合
     */
    @Override
    List<MemberEntity> findListByParentIdAndMemberLevel(Long parentId, Long levelId);

    /**
     * 根据上级parent_id的上级parent_id与等级id查找用户列表
     *
     * @param parentId 上级parentId
     * @return 用户id与用户名列表
     */
    @Override
    List<MemberEntity> findIdAndMemberNameListByParentIdOfParentIdAndLevelId(Long parentId, Long levelId);

    /**
     * 获取今日注册用户量
     *
     * @return 今日注册用户
     */
    @Override
    Long findCurDateCountMember();

    /**
     * 获取用户量
     *
     * @return 用户量
     */
    @Override
    Long findTotalMember();

    /**
     * 修改用户盐
     *
     * @param memberId 用户id
     * @param salt     盐
     * @return 成功返回True 失败返回False
     */
    @Override
    Boolean updateMemberSalt(Long memberId, String salt);

    /**
     * 修改用户交易盐
     *
     * @param memberId 用户id
     * @param salt     盐
     * @return 成功返回True 失败返回False
     */
    @Override
    Boolean updateMemberSecondarySalt(Long memberId, String salt);

    @Override
    Boolean updateMemberAddress(Long memberId, String address);

    /**
     * 根据多个用户id查找用户信息集合
     *
     * @param memberIds 用户id集合
     * @return 用户信息集合
     */
    @Override
    Collection<MemberEntity> findListByMemberIds(Collection<Long> memberIds);

    /**
     * 获取用户直推人数
     *
     * @param memberId 会员id
     * @return 直推人数
     */
    Long findByItemNum(Long memberId);

    /**
     * 查找指定用户id团队伞下所有人 除指定用户id
     *
     * @param memberId 用户id
     * @return 用户信息
     */
    Collection<MemberEntity> findAllMemberByMemberId(Long memberId);

    /**
     * 根据用户名查找用户信息
     *
     * @param memberName 用户名
     * @return 用户对象
     */
    @Override
    MemberEntity findByMemberName(String memberName);

    /**
     * 根据用户id修改用户状态
     *
     * @param memberId 用户id
     * @param status   要修改成的状态
     * @return 修改成功返回true 失败返回false
     */
    @Override
    Boolean updateStatus(Long memberId, Integer status);

    /**
     * 以下级用户id查找上级用户
     *
     * @param memberId 下级用户id
     * @return 上级用户
     */
    MemberEntity findParentMemberByMemberId(Long memberId);

    /**
     * 根据memberId模糊查找member_path字段用户列表 (包含memberId)
     *
     * @param memberId 用户id
     * @return 用户列表
     */
    Collection<MemberEntity> findByTree(Long memberId);

    /**
     * 根据member_code查找用户
     *
     * @param memberCode 用户唯一码
     * @return 如果存在返回用户对象 如果不存在则返回null
     */
    MemberEntity findByMemberCode(String memberCode);

    /**
     * 根据用户id集合，查询用户集合
     * @param memberIds
     * @return
     */
    List<MemberEntity> findByIds(List<Long> memberIds);
}

